﻿package frEngine.loaders.away3dMd5
{
    import __AS3__.vec.*;
    import flash.geom.*;
    import frEngine.loaders.away3dMd5.md5Data.*;
    import frEngine.math.*;

    public class JMatrix3D extends Matrix3D
    {
        public var userId:String;
        private const _templeVector3D1:Vector3D;
        private const _templeVector3D2:Vector3D;
        private const _templeQuaternion1:Quaternion;
        private const _templeQuaternion2:Quaternion;
        public static const rotationQuat:Quaternion = initRotationQuat();

        public function JMatrix3D(param1:Vector.<Number> = null)
        {
            this._templeVector3D1 = new Vector3D();
            this._templeVector3D2 = new Vector3D();
            this._templeQuaternion1 = new Quaternion();
            this._templeQuaternion2 = new Quaternion();
            super(param1);
            return;
        }// end function

        public function parser(param1:HierarchyData, param2:Vector.<Number>, param3:BaseFrameData) : void
        {
            var _loc_10:Number = NaN;
            var _loc_11:Number = NaN;
            var _loc_12:Number = NaN;
            var _loc_13:Number = NaN;
            var _loc_14:Number = NaN;
            var _loc_15:Number = NaN;
            var _loc_16:Number = NaN;
            var _loc_17:Number = NaN;
            var _loc_18:Number = NaN;
            var _loc_19:Number = NaN;
            var _loc_20:Number = NaN;
            var _loc_21:Number = NaN;
            var _loc_22:Number = NaN;
            var _loc_23:Number = NaN;
            var _loc_24:Quaternion = null;
            var _loc_25:Vector3D = null;
            var _loc_4:* = param1.startIndex;
            var _loc_5:* = param1.flags;
            var _loc_6:* = this._templeVector3D1;
            var _loc_7:* = this._templeQuaternion1;
            var _loc_8:* = this._templeVector3D2;
            var _loc_9:* = FrMatrix3DUtils.RAW_DATA_TO_Matrix3d;
            _loc_6.x = param3.position.x;
            _loc_6.y = param3.position.y;
            _loc_6.z = param3.position.z;
            _loc_7.x = param3.orientation.x;
            _loc_7.y = param3.orientation.y;
            _loc_7.z = param3.orientation.z;
            _loc_8.x = param3.scale.x;
            _loc_8.y = param3.scale.y;
            _loc_8.z = param3.scale.z;
            if (_loc_5 & 1)
            {
                _loc_6.x = param2[_loc_4++];
            }
            if (_loc_5 & 2)
            {
                _loc_6.y = param2[_loc_4++];
            }
            if (_loc_5 & 4)
            {
                _loc_6.z = param2[_loc_4++];
            }
            if (_loc_5 & 8)
            {
                _loc_7.x = param2[_loc_4++];
            }
            if (_loc_5 & 16)
            {
                _loc_7.y = param2[_loc_4++];
            }
            if (_loc_5 & 32)
            {
                _loc_7.z = param2[_loc_4++];
            }
            if (_loc_5 & 64)
            {
                _loc_8.x = param2[_loc_4++];
            }
            if (_loc_5 & 128)
            {
                _loc_8.y = param2[_loc_4++];
            }
            if (_loc_5 & 256)
            {
                _loc_8.z = param2[_loc_4++];
            }
            _loc_13 = 1 - _loc_7.x * _loc_7.x - _loc_7.y * _loc_7.y - _loc_7.z * _loc_7.z;
            _loc_7.w = _loc_13 < 0 ? (0) : (-Math.sqrt(_loc_13));
            if (param1.parentIndex < 0)
            {
                _loc_24 = this._templeQuaternion2;
                _loc_24.multiply(rotationQuat, _loc_7);
                _loc_25 = rotationQuat.rotatePoint(_loc_6);
            }
            else
            {
                _loc_24 = _loc_7;
                _loc_25 = _loc_6;
            }
            _loc_24.y = -_loc_24.y;
            _loc_24.z = -_loc_24.z;
            _loc_25.x = -_loc_25.x;
            _loc_10 = _loc_24.x;
            _loc_11 = _loc_24.y;
            _loc_12 = _loc_24.z;
            _loc_13 = _loc_24.w;
            _loc_14 = 2 * _loc_10 * _loc_11;
            _loc_15 = 2 * _loc_10 * _loc_12;
            _loc_16 = 2 * _loc_10 * _loc_13;
            _loc_17 = 2 * _loc_11 * _loc_12;
            _loc_18 = 2 * _loc_11 * _loc_13;
            _loc_19 = 2 * _loc_12 * _loc_13;
            _loc_20 = _loc_10 * _loc_10;
            _loc_21 = _loc_11 * _loc_11;
            _loc_22 = _loc_12 * _loc_12;
            _loc_23 = _loc_13 * _loc_13;
            _loc_9[0] = _loc_20 - _loc_21 - _loc_22 + _loc_23;
            _loc_9[4] = _loc_14 - _loc_19;
            _loc_9[8] = _loc_15 + _loc_18;
            _loc_9[1] = _loc_14 + _loc_19;
            _loc_9[5] = -_loc_20 + _loc_21 - _loc_22 + _loc_23;
            _loc_9[9] = _loc_17 - _loc_16;
            _loc_9[2] = _loc_15 - _loc_18;
            _loc_9[6] = _loc_17 + _loc_16;
            _loc_9[10] = -_loc_20 - _loc_21 + _loc_22 + _loc_23;
            this.copyRawDataFrom(_loc_9);
            this.prependScale(_loc_8.x, _loc_8.y, _loc_8.z);
            this.appendTranslation(_loc_25.x, _loc_25.y, _loc_25.z);
            return;
        }// end function

        private static function initRotationQuat(param1:Vector3D = null, param2:Number = 0) : Quaternion
        {
            var _loc_3:* = new Quaternion();
            var _loc_4:* = new Quaternion();
            var _loc_5:* = new Quaternion();
            _loc_4.fromAxisAngle(Vector3D.X_AXIS, (-Math.PI) * 0.5);
            _loc_5.fromAxisAngle(Vector3D.Y_AXIS, -Math.PI);
            _loc_3.multiply(_loc_5, _loc_4);
            if (param1)
            {
                _loc_4.fromAxisAngle(param1, param2);
                _loc_3.multiply(_loc_4, _loc_3);
            }
            return _loc_3;
        }// end function

    }
}
